# 作者：薛丰坤
# 2025年06月05日21时22分18秒
# 2634661037@qq.com
# 1、位置参数，keyword参数传递名字不对时的报错信息查看（和上课保持一致即可）
def demo(num, *args, **kwargs):
    print(num)
    print(args)
    print(kwargs)


demo(1,   3, 4, 5, 6, 7, name="小王", age=18, gender=True)

# 2、多值参数练习，元组，字典的传参拆包练习（和上课保持一致即可）


def study_return():
    return 1, 2


a, b = study_return()
print(a, b)


# 3.设计一个类，实例化1个对象，会实现下面两种行为（和上课保持一致即可）

#
# 需求
# •一只 黄颜色 的 狗狗 叫 小黄
# •具有  汪汪叫 行为
# •具有  摇尾巴 行为
class Dog:
    def __init__(self, name, color):
        self.name = name
        self.color = color

    def bark(self):
        print("汪汪叫---")

    def remove(self):
        print("摇尾巴---")


dog = Dog(name="小黄", color="黄色")
dog.bark()
dog.remove()




# 4、练习封装案例（和上课保持一致即可）
# 士兵突击
# 开发枪类
class Gun:
    def __init__(self, model):
        # 枪的型号
        self.model = model
        # 子弹数量
        self.bullet_count = 0

    def add_bullet(self, count):
        self.bullet_count += count

    def shoot(self):
        # 判断是否还有子弹
        if self.bullet_count <= 0:
            print("没有子弹了...")
            return

        # 发射一颗子弹
        self.bullet_count -= 1

        print("%s 发射子弹[%d]..." % (self.model, self.bullet_count))


class Soldier:
    def __init__(self, name):
        self.name = name
        self.gun = None

    def fire(self):
        if self.gun is None:
            print("[%s 还没有枪...]" % self.name)

            return
        print("冲啊...[%s]" % self.name)

        self.gun.add_bullet(50)

        self.gun.shoot()


# 实例化
ak47 = Gun("AK47")
xusanduo = Soldier("许三多")
xusanduo.gun = ak47
xusanduo.fire()
print(xusanduo.gun)
ak47.add_bullet(50)
ak47.shoot()

# 5、练习私有属性和私有方法（和上课保持一致即可）
class Women:
    def __init__(self, name, age):
        self.name = name
        self.__age = age

    def __secret(self):
        print(self.__age)

    def boy_friend(self):
        self.__secret()


xiaohong = Women("小红", 18)
xiaohong.boy_friend()

# 6、练习单继承案例（和上课保持一致即可）
class Dog(Animal):
    def __init__(self, name, color):

        super().__init__(name)
        self.color = color

    def bark(self):
        print("汪汪叫---")


if __name__ == '__main__':
    dog = Dog("大黄", "黄色")
    print(dog.name)
    print(dog.color)
    dog.bark()

# 7、实现单例模式（和上课保持一致即可
class MusicPlayer:
    instance = None

    # cls其实就是类名，下面其实就是类方法,new函数其实是用staticmethod来实现了一个类方法，自己把类名传进来
    # 下面的*args, **kwargs可以直接换成*more
    def __new__(cls, *args, **kwargs):  # 创建和返回一个新的对象就相当于c中的malloc函数,不写new它本身也会调用new，写的目的在于
        if cls.instance is None:  # 现在没有给对象申请空间。
            cls.instance=super().__new__(cls)  # 为对象申请分配空间括号里必须传入cls,申请空间的固定写法

        return cls.instance  # new返回的就是下面player1的地址，必须return回去

    def __init__(self):
        print("音乐播放器初始化")


player1 = MusicPlayer()  # player1接受的东西就是new返回的，也就是说init之前先做了new
player2 = MusicPlayer()
pass